﻿using Marimo.複雑なストップウォッチ.Common;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Marimo.複雑なストップウォッチ.Model
{
    public class スケジュール : BindableBase
    {
        public スケジュール()
        {
            PropertyChanged +=
                (sender, e) =>
                {
                    最終更新終了時間 = 終了時間;
                };

            項目 = new ObservableCollection<スケジュール項目>();
            項目.CollectionChanged +=
                (sender, e) =>
                {
                    if (e.OldItems != null)
                    {
                        foreach (var oldItem in e.OldItems.Cast<スケジュール項目>())
                        {
                            oldItem.PropertyChanged -= 各項目PropertyChanged;
                        }
                    }

                    if (e.NewItems != null)
                    {
                        foreach (var newItem in e.NewItems.Cast<スケジュール項目>())
                        {
                            newItem.PropertyChanged += 各項目PropertyChanged;
                        }
                    }
                    if (最終更新終了時間 != 終了時間)
                    {
                        OnPropertyChanged("終了時間");
                    }
                };
        }

        void 各項目PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "終了時間" && sender == 最終時間項目)
            {
                OnPropertyChanged("終了時間");
            }
        }

        private TimeSpan 最終更新終了時間;

        public TimeSpan 終了時間
        {
            get
            {
                return 最終時間項目.終了時間;
            }
            set
            {
                var 終了時間 = 最終時間項目.終了時間;
                SetProperty(ref 終了時間, value);
                最終時間項目.終了時間 = 終了時間;
            }
        }

        private スケジュール項目 デフォルト = new スケジュール項目();

        private スケジュール項目 最終時間項目
        {
            get
            {
                return
                    (
                        from 各項目 in 項目
                        orderby 各項目.終了時間 descending
                        select 各項目
                    ).FirstOrDefault() ?? デフォルト;
            }
        }

        public ObservableCollection<スケジュール項目> 項目 { get; private set; }
    }
}
